package com.learn.criminalintent.database

import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.learn.criminalintent.Crime

/**
 * 数据库类
 * @Database注解告诉Room，CrimeDatabase类就是应用里的数据库。
 * 这个注解本身也需要两个参数。第一个参数是实体类集合，告诉Room在创建和管理数据库表时该用哪个实体类。这里只传入了Crime类，因为整个应用就这么一个实体。
 * 第二个参数是数据库版本。对于新建数据库来说，版本号应该是1。随着未来应用升级，你可能会添加新的实体类，或者给现有实体类添加新属性。
 * 如果是这样，就需要修改实体类集合，增加数据库版本号，让Room知道数据库要升级了。
 */
@Database(entities = [Crime::class], version = 3, exportSchema = true)
// 配置类型转换器
@TypeConverters(CrimeTypeConverters::class)
abstract class CrimeDatabase : RoomDatabase() {

    // 在数据库类里登记DAO
    abstract fun crimeDao(): CrimeDao
}

/**
 * 数据库迁移
 * Migration类构造函数需要两个参数，第一个是迁移前的数据库版本，第二个是迁移到的版本。这里就是版本号1和2。
 */
val migration_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        // 执行数据库迁移操作
        database.execSQL("ALTER TABLE crime ADD COLUMN suspect TEXT NOT NULL DEFAULT ''")
    }
}

val migration_2_3 = object : Migration(2, 3) {
    override fun migrate(database: SupportSQLiteDatabase) {
        // 执行数据库迁移操作
        database.execSQL("ALTER TABLE crime ADD COLUMN phone TEXT NOT NULL DEFAULT ''")
    }
}

